<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>PL/Perl 触发器</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="plperl-trusted.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="plperl.html">快退</a></td><td width="60%" align="center" valign="bottom">章39. PL/Perl - Perl 过程语言</td><td width="10%" align="right" valign="top"><a href="plperl.html">快进</a></td><td width="10%" align="right" valign="top"><a href="plperl-missing.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="PLPERL-TRIGGERS">39.6. PL/Perl 触发器</a></h1>
<p>PL/Perl 可以用来书写触发器函数。在一个触发器函数中，散列引用 <tt class="VARNAME">$_TD</tt> 包含了当前触发事件的信息。<tt class="VARNAME">$_TD</tt> 是一个全局变量，它对于每次触发器调用都能够获取一个局部值。<tt class="VARNAME">$_TD</tt> 散列引用的字段有：</p>
<div class="VARIABLELIST">
<dl>
<dt><tt class="LITERAL">$_TD-&gt;{new}{foo}</tt></dt>
<dd><p>字段 <tt class="LITERAL">foo</tt> 的 <tt class="LITERAL">NEW</tt> 值</p></dd>
<dt><tt class="LITERAL">$_TD-&gt;{old}{foo}</tt></dt>
<dd><p>字段 <tt class="LITERAL">foo</tt> 的 <tt class="LITERAL">OLD</tt> 值</p></dd>
<dt><tt class="LITERAL">$_TD-&gt;{name}</tt></dt>
<dd><p>被调用的触发器的名字</p></dd>
<dt><tt class="LITERAL">$_TD-&gt;{event}</tt></dt>
<dd><p>触发器事件：<tt class="LITERAL">INSERT</tt>, <tt class="LITERAL">UPDATE</tt>, <tt class="LITERAL">DELETE</tt>, <tt class="LITERAL">UNKNOWN</tt></p></dd>
<dt><tt class="LITERAL">$_TD-&gt;{when}</tt></dt>
<dd><p>何时调用触发器：<tt class="LITERAL">BEFORE</tt>, <tt class="LITERAL">AFTER</tt>, <tt class="LITERAL">UNKNOWN</tt></p></dd>
<dt><tt class="LITERAL">$_TD-&gt;{level}</tt></dt>
<dd><p>触发器的级别：<tt class="LITERAL">ROW</tt>, <tt class="LITERAL">STATEMENT</tt>, <tt class="LITERAL">UNKNOWN</tt></p></dd>
<dt><tt class="LITERAL">$_TD-&gt;{relid}</tt></dt>
<dd><p>触发触发器的表的 OID</p></dd>
<dt><tt class="LITERAL">$_TD-&gt;{table_name}</tt></dt>
<dd><p>触发触发器的表的名字</p></dd>
<dt><tt class="LITERAL">$_TD-&gt;{relname}</tt></dt>
<dd><p>触发触发器的表的名字(反对使用，即将被废弃)</p></dd>
<dt><tt class="LITERAL">$_TD-&gt;{table_schema}</tt></dt>
<dd><p>触发触发器的表的模式名</p></dd>
<dt><tt class="LITERAL">$_TD-&gt;{argc}</tt></dt>
<dd><p>触发器函数的参数个数</p></dd>
<dt><tt class="LITERAL">@{$_TD-&gt;{args}}</tt></dt>
<dd><p>触发器函数的参数，如果 <tt class="LITERAL">$_TD-&gt;{argc}</tt>为 0 则不存在。</p></dd>
</dl>
</div>
<p>触发器返回下列之一：</p>
<div class="VARIABLELIST">
<dl>
<dt><tt class="LITERAL">return;</tt></dt>
<dd><p>执行该语句</p></dd>
<dt><tt class="LITERAL">"SKIP"</tt></dt>
<dd><p>不执行该语句</p></dd>
<dt><tt class="LITERAL">"MODIFY"</tt></dt>
<dd><p>表明 <tt class="LITERAL">NEW</tt> 行被触发器函数修改过</p></dd>
</dl>
</div>
<p>下面是一个触发器函数，演示了上面的一些东西。</p>
<pre class="PROGRAMLISTING">CREATE TABLE test (
    i int,
    v varchar
);

CREATE OR REPLACE FUNCTION valid_id() RETURNS trigger AS $$
    if (($_TD-&gt;{new}{i} &gt;= 100) || ($_TD-&gt;{new}{i} &lt;= 0)) {
        return "SKIP";    # 跳过 INSERT/UPDATE 命令
    } elsif ($_TD-&gt;{new}{v} ne "immortal") {
        $_TD-&gt;{new}{v} .= "(modified by trigger)";
        return "MODIFY";  # 修改一行并且执行 INSERT/UPDATE 命令
    } else {
        return;           # 执行 INSERT/UPDATE 命令
    }
$$ LANGUAGE plperl;

CREATE TRIGGER test_valid_id_trig
    BEFORE INSERT OR UPDATE ON test
    FOR EACH ROW EXECUTE PROCEDURE valid_id();</pre>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="plperl-trusted.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="plperl-missing.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">可信的和不可信的 PL/Perl</td><td width="34%" align="center" valign="top"><a href="plperl.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">限制及缺少的特性</td></tr>
</table>
</div>
</body></html>